package xfuzzy.alg_genetico.indeterminado.cross;

import java.util.Random;
import java.util.UUID;

import xfuzzy.xfghl.codification.DoubleChromosome;

public class CruceDosPuntos {
	
	public CruceDosPuntos(long seed)  {
		
		//super(seed);
	}

	public DoubleChromosome cruzar(DoubleChromosome padre1, DoubleChromosome padre2) {
		
		DoubleChromosome hijo = new DoubleChromosome(padre1.getNumVariables());
		//this.cruzarVariables(padre1, padre2, hijo);
		this.cruzarEstructura(padre1, padre2, hijo);
		return hijo;
	}
	
	protected DoubleChromosome cruzarEstructura(DoubleChromosome padre1, DoubleChromosome padre2, DoubleChromosome hijo)  {
		
		Random rnd = new Random(UUID.randomUUID().hashCode());
		int longitud_estructura = padre1.getNumVariables() + padre1.getNumModulos();
		char [] estructura_c1 = padre1.getEstructura();
		char [] estructura_c2 = padre2.getEstructura();
		char [] estructura_hijo = new char[longitud_estructura];
		int punto_corte1 = rnd.nextInt(longitud_estructura);
		int punto_corte2 = rnd.nextInt(longitud_estructura);
		while (punto_corte2 <= punto_corte1)
			punto_corte2 = rnd.nextInt(longitud_estructura);
		
		int indice_superior = 0, indice_inferior = 0;
		if (punto_corte1 > punto_corte2)  {
			indice_superior = punto_corte1;
			indice_inferior = punto_corte2;
		}
		else  {
			indice_superior = punto_corte2;
			indice_inferior = punto_corte1;
		}
	
		for (int index = 0; index < indice_inferior; index++)  {
			 estructura_hijo[index] = estructura_c2[index];
		}
		
		for (int index = indice_inferior; index <= indice_superior; index++)
			 estructura_hijo[index] = estructura_c1[index];
		
		for (int index = indice_superior + 1; index < longitud_estructura; index++)  {
			 estructura_hijo[index] = estructura_c2[index];
		}
		
		
		for (int index = punto_corte2; index < longitud_estructura; index++)
			 estructura_hijo[index] = estructura_c2[index];
		
		hijo.setEstructura(estructura_hijo);
		
//		System.out.println("Punto de corte 1 = " + punto_corte1);
//		System.out.println("Punto de corte 2 = " + punto_corte2);
//		System.out.print("Estructura c1 =   ");
//		for (int i = 0; i < estructura_c1.length; i++)
//			 System.out.print(estructura_c1[i]);
//		System.out.println();
//		System.out.print("Estructura c2 =   ");
//		for (int i = 0; i < estructura_c2.length; i++)
//			 System.out.print(estructura_c2[i]);
//		System.out.println();
//		System.out.print("Estructura hijo = ");
//		for (int i = 0; i < estructura_hijo.length; i++)
//			 System.out.print(estructura_hijo[i]);
		return hijo;
	}
}
